console.log(`[vite] connecting....`);
var socket = new WebSocket(`ws://${window.location.host}`, "vite-hmr");
socket.addEventListener("message", async ({ data }) => {
  handleMessage(JSON.parse(data));
});
// 处理更新消息
async function handleMessage(payload) {
  switch (payload.type) {
    case "connected":
      console.log(`[vite] connected`);
      break;
    case "update":
      console.log(payload);
      payload.updates.forEach((update) => {
        if (update.type === "js-update") {
          fetchUpdate(update);
        }
      });
  }
}
/**
 * 获取模块内容，实现更新重写发请求，获取render.js,拿到新内容，mian.js 重新刷新
 * @param {*} path 边界模块路径 /src/main.js
 * @param {*} acceptedPath 变更的模块路径 /src/renderModules.js
 */
async function fetchUpdate({ path, acceptedPath }) {
  // 热更新模块是否存在
  const module = window.hotModulesMap.get(path);
  if (!module) return;
  //存放模块路径和新的模块内容的映射
  const moduleMap = new Map();
  //将要更新的模块集合
  const modulesToUpdate = new Set();
  // deps   接受热更新的依赖;
  // callback   回调函数;
  for (const { deps, callback } of module.callbacks) {
    deps.forEach((dep) => {
      // deps 包含该 变更的模块路径
      if (acceptedPath === dep) {
        modulesToUpdate.add(dep);
      }
    });
  }
  // 请求新模块
  await Promise.all(
    Array.from(modulesToUpdate).map(async (dep) => {
      // 获取新内容
      const newModule = await import(dep + "?ts" + Date.now());
      //存放模块路径和新的模块内容的映射
      moduleMap.set(dep, newModule);
    })
  );
  // 上面promise获取所有新内容后，会执行更新逻辑
  for (const { deps, callback } of module.callbacks) {
    console.log(deps);
    console.log(moduleMap);
    let newModules = deps.map((dep) => moduleMap.get(dep));
    console.log("newModules", newModules);
    callback(newModules);
  }
  const logged = `${acceptedPath} via ${path}`;
  console.log(`[vite] hot updated ${logged}`);
}
